//+------------------------------------------------------------------+
//|                                              DefaultComparer.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include <Generic/Interfaces/IComparer.h>  // 比较器接口（IComparer<T>），定义比较逻辑的标准接口
#include "CompareFunction.h"               // 基础比较函数库（提供各基础类型的默认比较实现）

//+------------------------------------------------------------------+
//| CDefaultComparer<T> 类：默认比较器实现类                          |
//| 核心定位：实现 IComparer<T> 接口，作为所有支持比较的类型（基础类型/自定义类型）的默认比较器， |
//|           无需用户手动实现比较逻辑，直接复用 `CompareFunction.mqh` 中的基础比较能力 |
//| 核心特性：                                                      |
//|  1. 接口适配：严格实现 IComparer<T> 接口，可无缝接入所有依赖比较器的组件（如红黑树、有序集合、排序算法）； |
//|  2. 类型兼容：自动适配所有支持 `::Compare` 函数的类型（包括 MQL5 基础类型与实现 IComparable<T> 的自定义类型）； |
//|  3. 零配置使用：无需用户编写任何比较代码，直接实例化即可使用，降低开发成本； |
//|  4. 逻辑一致性：复用 `CompareFunction.mqh` 的比较规则，确保不同组件使用相同默认比较逻辑（如排序/查找结果一致）； |
//| 适用场景：所有**无需自定义比较规则**的场景，即使用“自然排序”（基础类型的默认顺序、自定义类型实现的 IComparable 逻辑），典型如： |
//|  - 基础类型有序存储（如 int 升序、string 字典序、datetime 时间序的红黑树/有序集合）； |
//|  - 通用排序算法（如对数组进行默认规则排序，无需额外传入比较器）； |
//|  - 自定义类型标准化比较（自定义类型已实现 IComparable<T>，直接使用默认比较器调用其 Compare 方法）； |
//|  - 组件快速集成（快速接入依赖 IComparer<T> 接口的框架类，无需单独开发比较器）； |
//+------------------------------------------------------------------+
template<typename T>
class CDefaultComparer : public IComparer<T>
  {
public:
   /**
    * @brief 默认构造函数：创建默认比较器实例
    * @note 无状态设计，实例化后即可直接使用，无需额外初始化配置
    */
                     CDefaultComparer(void);

   /**
    * @brief 析构函数：清理默认比较器资源
    * @note 无动态内存分配，仅执行基础析构逻辑
    */
                    ~CDefaultComparer(void);

   /**
    * @brief 比较两个对象，返回表示其大小关系的整数（实现 IComparer<T> 接口的核心方法）
    * @param x [in] 待比较的第一个对象（类型与泛型参数 T 一致）
    * @param y [in] 待比较的第二个对象（类型与泛型参数 T 一致）
    * @return int - 大小关系标识，规则严格遵循 IComparer<T> 接口定义：
    *               - 1：x > y（x 大于 y，按默认比较规则）；
    *               - -1：x < y（x 小于 y，按默认比较规则）；
    *               - 0：x == y（x 等于 y，或无法比较（如自定义类型未实现 IComparable<T>））；
    * @note 核心逻辑：直接调用全局比较函数 `::Compare(x, y)`（定义于 CompareFunction.mqh），具体比较规则由该函数决定：
    *       1. 若 T 为基础类型（如 int/double/string/datetime）：使用对应类型的自然排序规则（如 int 按数值大小、string 按字典序）；
    *       2. 若 T 为自定义类型且实现 IComparable<T>：调用自定义类型的 Compare 方法，执行其自定义比较逻辑；
    *       3. 若 T 为自定义类型但未实现 IComparable<T>：返回 0，表示无法比较（需避免此场景，建议自定义类型实现 IComparable<T>）；
    */
   int               Compare(T x, T y);
  };
//+------------------------------------------------------------------+